package com.cheval.rpcframe.common;

import java.io.Serializable;

public class Invocation implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 调用方实际调用伪代码：
     * ITestService service = ?;
     * String res1 = service.test1("张三");
     * System.out.println(res1);
     *
     * 由上得出调用方可以给供应方的信息有：（Invocation定义）
     *  1） 调用api的接口
     *  2） 调用api的名称
     *  3） 调用api的参数
     *
     *  根据java反射 供应方需要的信息有： （供应方需要将）
     *
     */

    /** 调用的方法所在接口的名称 */
    private String interfaceClassName;
    /** 调用的方法的名称 */
    private String invokedMethodName;
    /** 远程调用方法的参数类型(按参数顺序排序)。 因为方法可能重载，通过方法名invokedMethodName
     * 和argsTypes可以唯一确定一个方法，Class.getMethod(String methodName, Class<?> ...argsTypes)
     */
    private Class[] argsTypes;
    /** 参数 */
    private Object[] args;

    private String version;

    public Invocation(String interfaceClassName, String invokedMethodName, Class[] argsTypes, Object[] args) {
        this.interfaceClassName = interfaceClassName;
        this.invokedMethodName = invokedMethodName;
        this.argsTypes = argsTypes;
        this.args = args;
    }

    public Invocation(String interfaceClassName, String invokedMethodName, Class[] argsTypes, Object[] args, String version) {
        this.interfaceClassName = interfaceClassName;
        this.invokedMethodName = invokedMethodName;
        this.argsTypes = argsTypes;
        this.args = args;
        this.version = version;
    }

    public String getInterfaceClassName() {
        return interfaceClassName;
    }

    public void setInterfaceClassName(String interfaceClassName) {
        this.interfaceClassName = interfaceClassName;
    }

    public String getInvokedMethodName() {
        return invokedMethodName;
    }

    public void setInvokedMethodName(String invokedMethodName) {
        this.invokedMethodName = invokedMethodName;
    }

    public Class[] getArgsTypes() {
        return argsTypes;
    }

    public void setArgsTypes(Class[] argsTypes) {
        this.argsTypes = argsTypes;
    }

    public Object[] getArgs() {
        return args;
    }

    public void setArgs(Object[] args) {
        this.args = args;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}
